unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, 
  Controls, Forms, Dialogs,StdCtrls, ExtCtrls;

type
  TMainForm = class(TForm)
    imgA: TImage;
    ImgB: TImage;
    ImgBkground: TImage;
 
    Timer1: TTimer;
 
   procedure FormPaint(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   
   procedure Timer1Timer(Sender: TObject);

  private
    X,Y,dx,dy,W,H:integer;
    offScreen:TBitmap;

    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0,0,ImgBkGround.Picture.Bitmap);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  X:=10; Y:=10; dx:=10; dy:=10;
  W:=ImgA.Width; H:=ImgA.Height;

  offScreen:=TBitmap.Create;
  offScreen.Width:=W+2*dx;
  offScreen.Height:=H+2*dy;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
   if offScreen<>nil then offScreen.Free;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
begin

 with offScreen do begin
     Canvas.CopyMode:=cmSrcCopy;
     Canvas.CopyRect(Rect(0,0,
                                                offScreen.Width,
                                                offScreen.Height),
                                      ImgBkGround.canvas,
                                      Rect(X,Y,X+offScreen.Width,
                                                         Y+offScreen.Height));
    Canvas.CopyMode:=cmSrcAnd;
    Canvas.Draw(10,10,ImgA.Picture.Bitmap);
    Canvas.CopyMode:=cmSrcPaint;
    Canvas.Draw(10,10,ImgB.Picture.Bitmap);

 end;

 Canvas.Draw(X,Y,offScreen);

 if (X>=ImgBkGround.Width-W) or (X<0) then dx:=-dx;
 if (Y>=ImgBkGround.Height-H) or (Y<0) then dy:=-dy;

 X:=X+dx;
 Y:=Y+dY;
end;

end.
